package models

import (
	"driver_srv/basic/config"
	"gorm.io/gorm"
	"time"
)

// Driver 司机信息结构体，对应数据库driver表
type Driver struct {
	Id                               uint32    `gorm:"column:id;type:int UNSIGNED;primaryKey;not null;" json:"id"`
	UserId                           uint32    `gorm:"column:user_id;type:int UNSIGNED;comment:用户ID;not null;" json:"user_id"`                              // 用户ID
	CityId                           uint32    `gorm:"column:city_id;type:int UNSIGNED;comment:服务城市ID;not null;" json:"city_id"`                            // 服务城市ID
	ManageId                         uint32    `gorm:"column:manage_id;type:int UNSIGNED;comment:主管ID;not null;" json:"manage_id"`                          // 主管ID
	Name                             string    `gorm:"column:name;type:varchar(50);comment:司机姓名;not null;" json:"name"`                                     // 司机姓名
	IdCard                           string    `gorm:"column:id_card;type:varchar(18);comment:身份证号（唯一）;not null;" json:"id_card"`                           // 身份证号（唯一）
	Mobile                           string    `gorm:"column:mobile;type:char(11);comment:手机号;not null;" json:"mobile"`                                     // 手机号
	Sex                              uint8     `gorm:"column:sex;type:tinyint UNSIGNED;comment:性别：1男2女;not null;" json:"sex"`                               // 性别：1男2女
	Status                           uint8     `gorm:"column:status;type:tinyint UNSIGNED;comment:状态：1启用 2停用;not null;" json:"status"`                      // 状态：1启用 2停用
	ContractStartTime                time.Time `gorm:"column:contract_start_time;type:datetime;comment:合同有效期起;not null;" json:"contract_start_time"`        // 合同有效期起
	ContractEndTime                  time.Time `gorm:"column:contract_end_time;type:datetime;comment:合同有效期止;not null;" json:"contract_end_time"`            // 合同有效期止
	CreatedAt                        time.Time `gorm:"column:created_at;type:datetime;comment:创建时间;not null;default:CURRENT_TIMESTAMP;" json:"created_at"`  // 创建时间
	UpdatedAt                        time.Time `gorm:"column:updated_at;type:datetime;comment:修改时间9;not null;default:CURRENT_TIMESTAMP;" json:"updated_at"` // 修改时间9
	DeletedAt                        time.Time `gorm:"column:deleted_at;type:datetime;default:NULL;" json:"deleted_at"`
	CompanyLogoImg                   string    `gorm:"column:company_logo_img;type:varchar(255);comment:公司标识;default:NULL;" json:"company_logo_img"`                                                    // 公司标识
	RegistrationDistrictCode         string    `gorm:"column:registration_district_code;type:varchar(100);comment:注册地行政区代码;default:NULL;" json:"registration_district_code"`                            // 注册地行政区代码
	DriverBirthday                   time.Time `gorm:"column:driver_birthday;type:date;comment:司机出生日期;default:NULL;" json:"driver_birthday"`                                                            // 司机出生日期
	Nationality                      string    `gorm:"column:nationality;type:varchar(50);comment:国籍;default:NULL;" json:"nationality"`                                                                 // 国籍
	DriverNation                     string    `gorm:"column:driver_nation;type:varchar(50);comment:驾驶员民族;default:NULL;" json:"driver_nation"`                                                          // 驾驶员民族
	DriverLicenseNumber              string    `gorm:"column:driver_license_number;type:varchar(50);comment:驾驶证编号;default:NULL;" json:"driver_license_number"`                                          // 驾驶证编号
	MaritalStatus                    uint8     `gorm:"column:marital_status;type:tinyint UNSIGNED;comment:驾驶员婚姻状况: 1已婚 2未婚;default:NULL;" json:"marital_status"`                                        // 驾驶员婚姻状况: 1已婚 2未婚
	ForeignLanguageAbility           string    `gorm:"column:foreign_language_ability;type:varchar(100);comment:驾驶员外语能力;default:NULL;" json:"foreign_language_ability"`                                 // 驾驶员外语能力
	AppVersion                       string    `gorm:"column:app_version;type:varchar(20);comment:使用APP版本号;default:NULL;" json:"app_version"`                                                           // 使用APP版本号
	MapType                          string    `gorm:"column:map_type;type:varchar(50);comment:使用地图类型;default:NULL;" json:"map_type"`                                                                   // 使用地图类型
	Education                        string    `gorm:"column:education;type:varchar(20);comment:驾驶员学历;default:NULL;" json:"education"`                                                                  // 驾驶员学历
	HouseholdRegistrationAuthority   string    `gorm:"column:household_registration_authority;type:varchar(100);comment:户口登记机关名称;default:NULL;" json:"household_registration_authority"`                // 户口登记机关名称
	PermanentAddress                 string    `gorm:"column:permanent_address;type:varchar(200);comment:户口住址或常住地址;default:NULL;" json:"permanent_address"`                                             // 户口住址或常住地址
	CommunicationAddress             string    `gorm:"column:communication_address;type:varchar(200);comment:驾驶员通信地址（现居住地址）;default:NULL;" json:"communication_address"`                                // 驾驶员通信地址（现居住地址）
	DriverPhotoFileNumber            string    `gorm:"column:driver_photo_file_number;type:varchar(255);comment:驾驶员照片文件编号;default:NULL;" json:"driver_photo_file_number"`                               // 驾驶员照片文件编号
	DriverLicense                    string    `gorm:"column:driver_license;type:varchar(255);comment:机动车驾驶证;default:NULL;" json:"driver_license"`                                                      // 机动车驾驶证
	ScanOfMotorVehicleDrivingLicense string    `gorm:"column:scan_of_motor_vehicle_driving_license;type:varchar(255);comment:机动车驾驶证扫描件文件编号;default:NULL;" json:"scan_of_motor_vehicle_driving_license"` // 机动车驾驶证扫描件文件编号
	PermittedVehicleType             string    `gorm:"column:permitted_vehicle_type;type:varchar(5);comment:准驾车型:C1、C2、C3、B1;default:NULL;" json:"permitted_vehicle_type"`                              // 准驾车型:C1、C2、C3、B1
	DriverLicenseStart               time.Time `gorm:"column:driver_license_start;type:date;comment:驾驶证有效期起;default:NULL;" json:"driver_license_start"`                                                 // 驾驶证有效期起
	DriverLicenseEnd                 time.Time `gorm:"column:driver_license_end;type:date;comment:驾驶证有效期止;default:NULL;" json:"driver_license_end"`                                                     // 驾驶证有效期止
	IsTourTaxiDriver                 uint8     `gorm:"column:is_tour_taxi_driver;type:tinyint UNSIGNED;comment:是否巡游出租车驾驶员：1是 2否;default:NULL;" json:"is_tour_taxi_driver"`                              // 是否巡游出租车驾驶员：1是 2否
	OnlineTaxiLicenseNumber          string    `gorm:"column:online_taxi_license_number;type:varchar(255);comment:网络预约出租汽车驾驶员资格证号;default:NULL;" json:"online_taxi_license_number"`                     // 网络预约出租汽车驾驶员资格证号
	OnlineTaxiLicenseIssuer          string    `gorm:"column:online_taxi_license_issuer;type:varchar(255);comment:网络预约出租汽车驾驶员证发证机构;default:NULL;" json:"online_taxi_license_issuer"`                    // 网络预约出租汽车驾驶员证发证机构
	LicenseIssueDate                 time.Time `gorm:"column:license_issue_date;type:date;comment:资格证发证日期;default:NULL;" json:"license_issue_date"`                                                     // 资格证发证日期
	FirstLicenseIssueDate            time.Time `gorm:"column:first_license_issue_date;type:datetime;comment:初次领取资格证日期;default:NULL;" json:"first_license_issue_date"`                                   // 初次领取资格证日期
	LicenseValidStart                time.Time `gorm:"column:license_valid_start;type:datetime;comment:资格证有效期起日期;default:NULL;" json:"license_valid_start"`                                             // 资格证有效期起日期
	LicenseValidEnd                  time.Time `gorm:"column:license_valid_end;type:datetime;comment:资格证有效期止日期;default:NULL;" json:"license_valid_end"`                                                 // 资格证有效期止日期
	EquipmentDate                    time.Time `gorm:"column:equipment_date;type:datetime;comment:报备日期;default:NULL;" json:"equipment_date"`                                                            // 报备日期
	IsFullTimeDriver                 uint8     `gorm:"column:is_full_time_driver;type:tinyint UNSIGNED;comment:是否专职驾驶员:1是 2否;default:NULL;" json:"is_full_time_driver"`                                 // 是否专职驾驶员:1是 2否
	IsInBlacklist                    uint8     `gorm:"column:is_in_blacklist;type:tinyint UNSIGNED;comment:是否在驾驶员黑名单内：1是 2否;default:NULL;" json:"is_in_blacklist"`                                      // 是否在驾驶员黑名单内：1是 2否
	ServiceType                      uint8     `gorm:"column:service_type;type:tinyint UNSIGNED;comment:服务类型:1网络预约出租汽车 2私人小客车合乘 3巡游出租汽车;default:NULL;" json:"service_type"`                             // 服务类型:1网络预约出租汽车 2私人小客车合乘 3巡游出租汽车
	ContractSignCompany              string    `gorm:"column:contract_sign_company;type:varchar(255);comment:驾驶员合同（或协议）签署公司;default:NULL;" json:"contract_sign_company"`                                // 驾驶员合同（或协议）签署公司
	EmergencyContact                 string    `gorm:"column:emergency_contact;type:varchar(50);comment:紧急联系人;default:NULL;" json:"emergency_contact"`                                                  // 紧急联系人
	EmergencyContactMobile           string    `gorm:"column:emergency_contact_mobile;type:varchar(20);comment:紧急联系人电话;default:NULL;" json:"emergency_contact_mobile"`                                  // 紧急联系人电话
	EmergencyContactAddress          string    `gorm:"column:emergency_contact_address;type:varchar(200);comment:紧急联系人地址;default:NULL;" json:"emergency_contact_address"`                               // 紧急联系人地址
	MobileCarriers                   uint32    `gorm:"column:mobile_carriers;type:int UNSIGNED;comment:运营商：1移动 2联通 3电信;default:NULL;" json:"mobile_carriers"`                                           // 运营商：1移动 2联通 3电信
}

func (d *Driver) TableName() string {
	return "driver"
}

// 根据id查询司机是否存在
func (d *Driver) GetDriverId(driverId int64) error {
	return config.DB.Where("id = ?", driverId).First(&d).Error
}
func (d *Driver) DriverCreate() error {
	return config.DB.Create(&d).Error
}
func (d *Driver) DriverMessageByUpdate(db *gorm.DB) error {
	return config.DB.Model(&Driver{}).Where("id = ?", d.Id).Updates(&d).Error
}

// 驾驶员身份证的唯一
func (d *Driver) DriverIdCardUnique(count int64) error {
	return config.DB.Model(&Driver{}).Where("id_card = ?", d.IdCard).Count(&count).Error
}
func (d *Driver) FindDriverById() error {
	return config.DB.Where("id = ?", d.Id).First(&d).Error
}

// FindDriverList 查询司机列表
func (d *Driver) FindDriverList(driverId int64, page int, pageSize int) ([]Driver, int64, error) {
	var drivers []Driver
	var total int64

	// 构建查询
	db := config.DB.Model(&Driver{})
	db = db.Where("deleted_at IS NULL")

	// 添加driver_id条件
	if driverId > 0 {
		db = db.Where("id = ?", driverId).Scopes(Paginate(page, pageSize))
	}

	// 计算总条数
	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	// 查询司机列表
	if err := db.Find(&drivers).Error; err != nil {
		return nil, 0, err
	}

	return drivers, total, nil
}
func Paginate(page int, pageSize int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		if page <= 0 {
			page = 1
		}
		switch {
		case pageSize > 100:
			pageSize = 100
		case pageSize <= 0:
			pageSize = 10
		}
		offset := (page - 1) * pageSize
		return db.Offset(offset).Limit(pageSize)
	}
}
func (d *Driver) ListsDriver(page int, pageSize int) (list []*Driver, total int64, err error) {
	err = config.DB.Model(&Driver{}).Count(&total).Scopes(Paginate(page, pageSize)).Find(&list).Error
	return
}

// 获取司机所有关联数据（车辆、培训课程、银行账户、证件图片）
func (d *Driver) GetAllRelatedData() (
	vehicle *Vehicle,
	trainingCourses []DriverTrainingCourse,
	bankAccount *BankAccount,
	idImg *DriverIdImg,
	err error,
) {
	// 初始化结构体
	vehicle = &Vehicle{DriverId: int32(d.Id)}
	trainingCourse := &DriverTrainingCourse{DriverId: d.Id}
	bankAccount = &BankAccount{DriverId: d.Id}
	idImg = &DriverIdImg{DriverId: d.Id}

	// 查询车辆信息
	if err = vehicle.FindVehicleByDriverId(); err != nil && err != gorm.ErrRecordNotFound {
		return nil, nil, nil, nil, err
	} else if err == gorm.ErrRecordNotFound {
		vehicle = nil
	}

	// 查询培训课程列表
	trainingCourses, err = trainingCourse.FindTrainingCoursesByDriverId()
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil, nil, nil, nil, err
	}

	// 查询银行账户信息
	if err = bankAccount.FindBankAccountByDriverId(); err != nil && err != gorm.ErrRecordNotFound {
		return nil, nil, nil, nil, err
	} else if err == gorm.ErrRecordNotFound {
		bankAccount = nil
	}

	// 查询证件图片信息
	if err = idImg.FindDriverIdImgByDriverId(); err != nil && err != gorm.ErrRecordNotFound {
		return nil, nil, nil, nil, err
	} else if err == gorm.ErrRecordNotFound {
		idImg = nil
	}

	return vehicle, trainingCourses, bankAccount, idImg, nil
}
